#!/usr/bin/env python
# coding: utf-8

from operator import itemgetter

conta_indiv = {}
conta_par = {}
conta_opcao = [{},{}]
len_cabecalho = 0
eleitores = set()
for lin in (lin.strip() for lin in open('votos-sha1.csv')):
    if not lin: continue
    partes = lin.split(',')
    if partes[0] == 'Timestamp': 
        len_cabecalho = len(partes)
        continue
    email = partes[2].strip().lower()
    if email in eleitores:
        continue # nao contar voto de e-mail duplicado
    else:
        eleitores.add(email)    
    if len(partes) == len_cabecalho:
        # formar par ordenado alfabetica// p/ facilitar a contagem de pares
        par = tuple(sorted(partes[-2:]))
        if par[0] == par[1]: # ignorar voto duplicado
            par = (par[0], '')
    elif len(partes) == (len_cabecalho-1): # segunda opção em branco
        par = (partes[-1], '')
    else:
        raise ValueError('linha mal formada: (%r)' % lin)
    conta_par[par] = conta_par.get(par,0) + 1
    for opcao, conv in enumerate(par):
        if conv: # contar apenas itens não vazios no par
            conta_indiv[conv] = conta_indiv.get(conv,0) + 1
            conta_opcao[opcao][conv] = conta_opcao[opcao].get(conv,0) + 1
        
print 'Total geral de votos por nome'
for conv, votos in sorted(conta_indiv.items(), key=itemgetter(1), reverse=True):
    print '%3d %s' % (votos, conv)

for opcao in (0,1):
    print '\nTotal de votos na opcao', opcao + 1
    for conv, votos in sorted(conta_opcao[opcao].items(), key=itemgetter(1), reverse=True):
        print '%3d %s' % (votos, conv)

print '\nOs 10 pares mais votados (itens do par em ordem decrescente de votos)'
for par, votos in sorted(conta_par.items(), key=itemgetter(1), reverse=True)[:10]:
    if par[0] and par[1] and conta_indiv[par[0]] < conta_indiv[par[1]]:
        par = (par[1], par[0])
    print '%3d %s' % (votos, par)
    
print '\n%s votos contabilizados' % len(eleitores)
